import { extend, ResponseError, RequestOptionsInit } from 'umi-request';
import { notification, message } from 'antd';
import {getCookie} from '@/utils/cookie'

const codeMessage = {
  '200': '服务器成功返回请求的数据。',
  '201': '新建或修改数据成功。',
  '202': '一个请求已经进入后台排队（异步任务）。',
  '204': '删除数据成功。',
  '400': '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  '401': '用户没有权限（令牌、用户名、密码错误）。',
  '403': '用户得到授权，但是访问是被禁止的。',
  '404': '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  '406': '请求的格式不可得。',
  '410': '请求的资源被永久删除，且不会再得到的。',
  '422': '当创建一个对象时，发生一个验证错误。',
  '500': '服务器发生错误，请检查服务器。',
  '502': '网关错误。',
  '503': '服务不可用，服务器暂时过载或维护。',
  '504': '网关超时。',
};
message.config({
  top: 100,
});
/**
 * 异常处理程序
 */
const errorHandler = (error: { response: Response }): Response => {
  const { response } = error;
  message.destroy();
  if (response && response.status) {
    if (response.status === 403) {
      // window.location.replace('#/front/login');
    }
    if (response.status === 500) {
      notification.error({
        description: '服务器发生错误，请稍后再试',
        message: '服务器内部错误',
      });
      throw new Error('服务器内部错误')
    }
    // const errorText = codeMessage['200'] || response.statusText;
    // const { status, url } = response;

    // notification.error({
    //   message: '未知异常', //`请求错误 ${status}: ${url}`,
    //   description: '请稍后再试',
    // });
  } else if (!response) {
    notification.error({
      description: '您的网络发生异常，无法连接服务器',
      message: '网络异常',
    });
    throw new Error('网络异常')
  }
  throw new Error('请求错误')
};

const headers: HeadersInit = {
  'Content-Type': 'application/json',
  token: getCookie('token') || '',
};

// console.log(process.env);

// if (process.env.NODE_ENV === 'development') {
//   headers.token =
// }

const requestOptions = {
  prefix: '/evdata-hydrogen-ui/api',
  timeout: 10000,
  errorHandler,
  headers,
};

const getRequestOptions = () => {
  const token = getCookie('token') || '';

  return {
    prefix: '/evdata-hydrogen-ui/api',
    timeout: 10000,
    errorHandler,
  };
};

const request = extend(getRequestOptions());

const requestLoading = extend(getRequestOptions());

request.use(async (ctx, next) => {
  const { req } = ctx;
  req.options.headers = {
    'Content-Type': 'application/json',
    token: getCookie('token') || '',
  };
  await next();
  if (ctx.res.code === 5002) {
    // 登录过期
    window.location.replace(process.env.LOGIN_URL as string);
  }
});
/**
 * @description: 有loading的请求
 * @param {*} async
 * @param {*} next
 * @return {*}
 */
requestLoading.use(async (ctx, next) => {
  const key = 'loading';
  const { req } = ctx;
  req.options.headers = {
    'Content-Type': 'application/json',
    token: getCookie('token') || '',
  };
  message.loading({ content: '加载中...', key });
  await next();
  message.destroy();
  if (ctx.res.code === 5002) {
    // 登录过期
    window.location.replace(process.env.LOGIN_URL as string);
  }
});

export const loadingHttps = requestLoading;

export const https = request;
